#include "RecvSomeBytesOp.h"

using namespace WONAPI;

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
DWORD RecvSomeBytesOp::mInitDelay = 0;

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
RecvSomeBytesOp::RecvSomeBytesOp(unsigned short theMaxBytes, AsyncSocket *theSocket, bool doDelay) : SocketOp(theSocket)
{
	mSocketEvent[SocketEvent_Read] = true;
	mMaxBytes = theMaxBytes;
	mCurRecv = NULL;

	mDoDelay = doDelay;
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
RecvSomeBytesOp::~RecvSomeBytesOp()
{
	delete mCurRecv;
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
WONStatus RecvSomeBytesOp::Start()
{
	if(mCurRecv!=NULL)
		delete mCurRecv;
	
	mCurRecv = new char[mMaxBytes];
	mStartTime = GetTickCount();

	return Continue();
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
WONStatus RecvSomeBytesOp::Continue()
{
	mSocket->WaitForRead(TimeLeft());

	int aRecvLen = 0;
	WONStatus aStatus;

	if (mDoDelay && mInitDelay>0 && GetTickCount()-mStartTime<mInitDelay)
		return WS_TimedOut;
	
	aStatus = mSocket->RecvBytes(mCurRecv,mMaxBytes,&aRecvLen);	
	if(aRecvLen>0)
	{
		mRecvBytes = new ByteBuffer(mCurRecv,aRecvLen,true);
		mCurRecv = NULL;
		aStatus = WS_Success;
	}
	
	return aStatus;
}
